/*
 * 错误处理约定：
 * 错误分成两类：serviceExceps（业务层异常）、msgs（表单验证异常）和errors（其他异常或错误）
 * 格式(json)：{serviceExceps:"...",errors:"...", msgs:"..."}
 * 
 */

(function($){	
	var methods = {
		init:function(options){
			return this.each(function(){
				
				if($.fn.datagridex.defaults.dialog)
					$.fn.datagridex.defaults.dialog.dialog({
						buttons:[{
							text:'确定',
							iconCls:'icon-ok',
							plain:'true',
							handler:function(){
								methods.submitForm();								
							}
						},{
							text:'取消',
							iconCls:'icon-undo',
							plain:'true',
							handler:function(){
								$.fn.datagridex.defaults.dialog.dialog('close');
							}
						}]
					});
				//添加事件
				if($.fn.datagridex.defaults.addButton)
					$.fn.datagridex.defaults.addButton.bind('click.datagridex', function(){				
						methods.add();					
					});
				//修改事件
				if($.fn.datagridex.defaults.updateButton)
					$.fn.datagridex.defaults.updateButton.bind('click.datagridex', function(){
						methods.update();
					});
				//删除事件
				if($.fn.datagridex.defaults.delButton)
					$.fn.datagridex.defaults.delButton.bind('click.datagridex', function(){					
						methods.del();
					});
				//查询事件
				if($.fn.datagridex.defaults.searchButtons && $.fn.datagridex.defaults.searchForms)
					$.each($.fn.datagridex.defaults.searchButtons,function(i,v){
						v.bind('click.datagridex',function(){
							methods.search($.fn.datagridex.defaults.searchUrls[i],$.fn.datagridex.defaults.searchForms[i]);
						});
					});
			});
		},
		add:function(){		
			methods.removeMistakesArea([$.fn.datagridex.defaults.errMsgsContainer,$.fn.datagridex.defaults.dialogErrMsgsContainer]);
			$.fn.datagridex.defaults.dialog.dialog({title:'添加'}).dialog('open');
			$.fn.datagridex.defaults.form.form('clear');
			$.extend($.fn.form.defaults,{url:$.fn.datagridex.defaults.addUrl});
		},
		update:function(){
			var row = $.fn.datagridex.defaults.datagrid.datagrid('getSelected');
			if( !row ){
				$.messager.alert( '提示', '请选择您要修改的记录！');
				return;
			}	
			methods.removeMistakesArea([$.fn.datagridex.defaults.errMsgsContainer,$.fn.datagridex.defaults.dialogErrMsgsContainer]);
			$.fn.datagridex.defaults.dialog.dialog({title:'修改'}).dialog('open');
			$.fn.datagridex.defaults.form.form('clear').form('load',row);
			$.extend($.fn.form.defaults,{url:$.fn.datagridex.defaults.updateUrl});
		},
		del:function(){
			var row = $.fn.datagridex.defaults.datagrid.datagrid('getSelected');
			if( !row ){
				$.messager.alert( '提示', '请选择您要删除的记录！');
				return;
			}
			$.messager.confirm('确认','您确实要删除该记录吗？',function(r){
				if(r){
					var rowIndex = $.fn.datagridex.defaults.datagrid.datagrid('getRowIndex',row);
					$.post($.fn.datagridex.defaults.delUrl,row,function(d){
						$.fn.datagridex.defaults.datagrid.datagrid('deleteRow',rowIndex);
					},'json');
				}
			});						
		},
		search:function(url,$form){
			$.extend($.fn.form.defaults,{url:url});
			$form.form('submit',{
				onSubmit:function(){
					//提交表单前要先验证
				},
				success:function(d){
					//var _d = $.parseJSON(d);
					methods.handleResponseData($.parseJSON(d));
				},
				onLoadError:function(){
					$.messager.alert('错误','数据加载失败！请刷新页面...');
					return;
				}
			});
		},
		submitForm:function(){
			$.fn.datagridex.defaults.form.form('submit',{
				onSubmit:function(){
					//提交表单前要先验证
					if($(this).form('validate')){
						return true;
					}else{
						return false;
					}
				},
				success:function(d){
					methods.handleResponseData($.parseJSON(d));					
				},
				onLoadError:function(){
					$.messager.alert('错误','数据加载失败！请刷新页面...');
					return;
				}
			});
		},
		handleResponseData:function(d){
			//处理响应数据			
			if(d.serviceExceps){
				//业务层出错，格式：{serviceExceps : "..."}
				var container;
				if($.fn.datagridex.defaults.dialog.dialog('options').closed)
					container =  $.fn.datagridex.defaults.errMsgsContainer;		
				else
					container = $.fn.datagridex.defaults.dialogErrMsgsContainer;	
				methods.showMistakes(container,d.serviceExceps);
				return;
			}else if(d.msgs){
				//表单验证出错，格式：{ "msgs" ："..."}
				var container;
				if($.fn.datagridex.defaults.dialog.dialog('options').closed)
					container =  $.fn.datagridex.defaults.errMsgsContainer;		
				else
					container = $.fn.datagridex.defaults.dialogErrMsgsContainer;	
				methods.showMistakes(container,d.msgs,$.fn.datagridex.defaults.filedMap);
				return;
			}else if(d.errors){
				//其他错误
				var container;
				if($.fn.datagridex.defaults.dialog.dialog('options').closed)
					container =  $.fn.datagridex.defaults.errMsgsContainer;		
				else
					container = $.fn.datagridex.defaults.dialogErrMsgsContainer;								
				methods.showMistakes(container,d.errors);
				return;
			}else if(d.rows){
				//返回结果集，格式：{"rows":[]}
				$.fn.datagridex.defaults.datagrid.datagrid('loadData',d.rows);
				$.fn.datagridex.defaults.dialog.dialog('close');
				return;
			}else if(d.rows == null){
				$.messager.alert('','您查找的数据不存在！');
				return;
			}else{
				$.messager.alert('未知错误',d);
				return;
			}			
		},
		showMistakes:function(container,msgs,map){
			var co = container.addClass('ErrorTip');
			var ot;
			var oc;
			//查看是否已经添加错误div
			var odivs = co.find('div');
			if(0 == odivs.length){
				ot = $('<div>您的请求有错误</div>').appendTo(co).addClass('ErrorTip_title');
				oc = $('<div/>').appendTo(co).addClass('ErrorTip_content');
			}else{
				ot = odivs[0];
				oc = odivs[1];
				if(oc)
					$(oc).empty();
			}
			if(map){
				for(var x in msgs){
					$('<div>' + map[x] + " : " + msgs[x] + '</div>').appendTo(oc);
				}
			}else{
				$('<div>' + msgs + '</div>').appendTo(oc);
			}			
			co.show();
		},
		removeMistakesArea:function(containers){
			$.each(containers,function(i,v){
				v.hide();
			});
			return;
		}
	};
	
	$.fn.datagridex = function(_1){
		if(methods[_1]){
			//$.extend($.fn.datagridex.defaults,_2);
			return methods[_1].apply(this,Array.prototype.slice.call(arguments,1));
		}else if(typeof _1 === 'object' || !_1){
			$.extend($.fn.datagridex.defaults,_1);
			return methods.init.apply(this, arguments);
		}else{
			$.error('method error : ' + _1);
		}
	};
	$.fn.datagridex.defaults = {
		datagrid:null,
		dialog:null,
		addButton:null,
		delButton:null,
		updateButton:null,
		searchButtons:null,  //eg. [$('#searchBtn1',$('#searchBtn2')]
		searchForms:null,    //eg. [$('#form1'),$('#form2')]
		searchUrls:null,     //eg. ['/xxx/xxx.action','/yyy/yyy.action']
		form:null,
		addUrl:null,
		delUrl:null,
		updateUrl:null,
		errMsgsContainer:null,//在主界面中定义一个显示错误信息的标签
		dialogErrMsgsContainer:null,//在dialog中定义一个显示错误信息的标签
		filedMap:null //要进行服务器验证的字段
	};
})(jQuery);

